
import os
import sys
import glob
import ctypes



class AppIconManager:
    def __init__(self, root, default_icon_path=None):
        """
        初始化图标管理器
        :param root: tkinter 根窗口
        :param default_icon_path: 默认图标路径（可选）
        """
        self.root = root
        
        # 修改为项目相对路径
        base_path = self.get_project_root_path()
        self.default_icon_path = default_icon_path or os.path.join(base_path, "raw", "book.ico")
        
        self.actual_icon_path = None
        
        # 自动设置图标
        self.setup_icons()

    def is_frozen(self):
        """检查是否在打包环境中运行"""
        return getattr(sys, 'frozen', False)

    def get_base_path(self):
        """获取当前运行路径（处理打包环境）"""
        if self.is_frozen():
            return os.path.dirname(sys.executable)
        return os.path.dirname(os.path.abspath(__file__))

    def get_project_root_path(self):
        """获取项目根目录路径"""
        if self.is_frozen():
            return os.path.dirname(sys.executable)
        
        # 在开发模式下，向上回溯找到项目根目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        
        # 假设项目结构为：项目根目录/raw/book.ico
        # 尝试向上查找直到找到raw文件夹或到达根目录
        max_levels = 5  # 最多向上查找5级目录
        for i in range(max_levels):
            # 检查当前目录是否有raw文件夹
            raw_dir = os.path.join(current_dir, "raw")
            if os.path.exists(raw_dir):
                return current_dir
            
            # 检查上一级目录
            parent_dir = os.path.dirname(current_dir)
            if parent_dir == current_dir:  # 已经到达根目录
                break
            current_dir = parent_dir
        
        # 如果没找到，回退到原来的方法
        return self.get_base_path()

    def find_icon_files(self):
        """查找当前目录下的所有ico文件"""
        base_path = self.get_project_root_path()
        ico_files = []
        
        # 查找项目根目录下的ico文件
        ico_files.extend(glob.glob(os.path.join(base_path, "*.ico")))
        
        # 查找raw文件夹下的ico文件
        raw_dir = os.path.join(base_path, "raw")
        if os.path.exists(raw_dir):
            ico_files.extend(glob.glob(os.path.join(raw_dir, "*.ico")))
        
        return ico_files

    def select_icon_path(self):
        """
        选择要使用的图标路径
        优先级：1. 当前目录下的ico文件 2. raw文件夹下的ico文件 3. 默认图标路径
        """
        # 查找所有可能的ico文件
        found_icons = self.find_icon_files()
        
        if found_icons:
            # 按文件名排序后取第一个
            found_icons.sort()
            print(f"找到图标文件: {found_icons}")
            return found_icons[0]
        
        # 检查默认图标是否存在
        if os.path.exists(self.default_icon_path):
            print(f"使用默认图标: {self.default_icon_path}")
            return self.default_icon_path
        
        print(f"默认图标路径不存在: {self.default_icon_path}")
        return None

    def set_windows_appid(self):
        """设置Windows任务栏应用ID（防止图标重复）"""
        if sys.platform == 'win32':
            try:
                ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(
                    "MyCompany.MyApp.1.0"  # 固定ID，确保唯一
                )
                return True
            except Exception as e:
                print(f"设置AppUserModelID失败: {e}")
                return False
        return False

    def set_window_icon(self, icon_path):
        """设置窗口图标"""
        try:
            self.root.iconbitmap(icon_path)
            self.actual_icon_path = icon_path
            return True
        except Exception as e:
            print(f"设置窗口图标失败: {e}")
            return False

    def setup_icons(self):
        """主设置方法"""
        # 1. 设置Windows任务栏应用ID（必须在窗口创建前调用）
        self.set_windows_appid()
        
        # 2. 查找并设置图标
        icon_path = self.select_icon_path()
        if icon_path:
            if not self.set_window_icon(icon_path):
                print("无法设置窗口图标，将使用默认图标")
        else:
            print("未找到可用图标文件，将使用默认图标")
        
        # 打印调试信息
        print("\n=== 图标设置信息 ===")
        print(f"运行环境: {'打包' if self.is_frozen() else '脚本'}")
        print(f"项目根目录: {self.get_project_root_path()}")
        print(f"默认图标路径: {self.default_icon_path}")
        print(f"使用图标: {self.actual_icon_path or '默认图标'}")
        print(f"系统平台: {sys.platform}")
        
        # 调试信息：检查raw目录是否存在
        raw_dir = os.path.join(self.get_project_root_path(), "raw")
        print(f"raw目录存在: {os.path.exists(raw_dir)}")
        if os.path.exists(raw_dir):
            print(f"raw目录内容: {os.listdir(raw_dir)}")